home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / visulztn / saoimage / saoimage.lha / btnlib / tool / bitmap.c next >
C/C++ Source or Header  |  1990-03-28  |  3KB  |  120 lines

  1. #ifndef lint
  2. static char SccsId[] = "%W%  %G%";
  3. #endif
  4.  
  5. /* Module:    Bitmap.c
  6.  * Subroutine:    btn_ByteToBitmap()    returns: unsigned char *
  7.  * Subroutine:    btn_WriteBitmaps()    returns: void
  8.  * Copyright:    1989 Smithsonian Astrophysical Observatory
  9.  *        You may do anything you like with this file except remove
  10.  *        this copyright.  The Smithsonian Astrophysical Observatory
  11.  *        makes no representations about the suitability of this
  12.  *        software for any purpose.  It is provided "as is" without
  13.  *        express or implied warranty.
  14.  * Modified:    {0} Michael VanHilst    initial version           9 May 1989
  15.  *        {n} <who> -- <does what> -- <when>
  16.  */
  17.  
  18. #include <stdio.h>
  19.  
  20. #define ROW_WIDTH 12
  21.  
  22. /*
  23.  * Subroutine:    btn_ByteToBitmap
  24.  * Purpose:    given a Z image return a bitmap image
  25.  */
  26. unsigned char *btn_ByteToBitmap ( image, width, height, byte_width )
  27.      char *image;
  28.      int width, height;
  29.      int *byte_width;
  30. {
  31.   unsigned char *bitmap, *map;
  32.   int wdth, row;
  33.   int line_bit, byte_end;
  34.   unsigned char bit;
  35.   char *btn_Alloc();
  36.  
  37.   /* allocate the bitmap */
  38.   wdth = (width + 7) / 8;
  39.   bitmap = (unsigned char *)btn_Alloc(wdth * height, 1, "bitmap");
  40.   /* make bitmap one row at a time */
  41.   for( row = 0; row < height; row++ ) {
  42.     map = bitmap + (row * wdth);
  43.     line_bit = 0;
  44.     byte_end = 8;
  45.     /* go through one line */
  46.     while( line_bit < width ) {
  47.       bit = 1;
  48.       if( byte_end > width )
  49.     byte_end = width;
  50.       /* go through one byte */
  51.       while( line_bit < byte_end ) {
  52.     if( *image != 0 )
  53.       *map |= bit;
  54.     image++;
  55.     line_bit++;
  56.     bit = bit << 1;
  57.       }
  58.       /* advance to next byte */
  59.       byte_end += 8;
  60.       map++;
  61.     }
  62.   }
  63.   /* set byte width and return bitmap */
  64.   *byte_width = wdth;
  65.   return( bitmap );
  66. }
  67.  
  68. /*
  69.  * Subroutine:    btn_WriteBitmaps
  70.  * Purpose:    write bitmap as array declaration in the file
  71.  */
  72. void
  73. btn_WriteBitmaps ( file, title, ext, icon, mask, width, height, byte_width )
  74.      FILE *file;
  75.      char *title;
  76.      char *ext;
  77.      unsigned char *icon;
  78.      unsigned char *mask;
  79.      int width, height;
  80.      int byte_width;
  81. {
  82.   int byte, row_end, map_end;
  83.  
  84.   (void)fprintf(file, "#define %s_%s_width %d\n", title, ext, width);
  85.   (void)fprintf(file, "#define %s_%s_height %d\n", title, ext, height);
  86.   (void)fprintf(file, "static char %s_%s_label[] = {\n", title, ext);
  87.   map_end = byte_width * height;
  88.   row_end = ROW_WIDTH;
  89.   byte = 0;
  90.   while( byte < map_end ) {
  91.     (void)fprintf(file, "  0x%02x", icon[byte]);
  92.     if( row_end > map_end )
  93.       row_end = map_end;
  94.     while( ++byte < row_end )
  95.       (void)fprintf(file, ", 0x%02x", icon[byte]);
  96.     if( byte == map_end )
  97.       (void)fprintf(file, " };\n");
  98.     else
  99.       (void)fprintf(file,",\n");
  100.     row_end += ROW_WIDTH;
  101.   }
  102.   if( mask != NULL ) {
  103.     (void)fprintf(file, "static char %s_%s_mask[] = {\n", title, ext);
  104.     row_end = ROW_WIDTH;
  105.     byte = 0;
  106.     while( byte < map_end ) {
  107.       (void)fprintf(file, "  0x%02x", mask[byte]);
  108.       if( row_end > map_end )
  109.     row_end = map_end;
  110.       while( ++byte < row_end )
  111.     (void)fprintf(file, ", 0x%02x", mask[byte]);
  112.       if( byte == map_end )
  113.     (void)fprintf(file, " };\n");
  114.       else
  115.     (void)fprintf(file,",\n");
  116.       row_end += ROW_WIDTH;
  117.     }
  118.   }
  119. }
  120.